}
#ifndef CONFIG_ARM /* TODO - runtime service support */
+
+static bool_t __initdata efi_rs_enable = 1;
+boolean_param("efi-rs", efi_rs_enable);
+
#ifndef USE_SET_VIRTUAL_ADDRESS_MAP
static __init void copy_mapping(unsigned long mfn, unsigned long end,
bool_t (*is_valid)(unsigned long smfn,
desc->PhysicalStart, desc->PhysicalStart + len - 1,
desc->Type, desc->Attribute);
- if ( !(desc->Attribute & EFI_MEMORY_RUNTIME) )
+ if ( !efi_rs_enable || !(desc->Attribute & EFI_MEMORY_RUNTIME) )
continue;
desc->VirtualStart = INVALID_VIRTUAL_ADDRESS;
}
}
+ if ( !efi_rs_enable )
+ {
+ efi_fw_vendor = NULL;
+ return;
+ }
+
#ifdef USE_SET_VIRTUAL_ADDRESS_MAP
efi_rs->SetVirtualAddressMap(efi_memmap_size, efi_mdesc_size,
mdesc_ver, efi_memmap);
static const u32 mxcsr = MXCSR_DEFAULT;
unsigned long cr3 = read_cr3();
+ if ( !efi_l4_pgtable )
+ return 0;
+
save_fpu_enable();
asm volatile ( "fldcw %0" :: "m" (fcw) );
asm volatile ( "ldmxcsr %0" :: "m" (mxcsr) );
void efi_rs_leave(unsigned long cr3)
{
+ if ( !cr3 )
+ return;
write_cr3(cr3);
if ( is_pv_vcpu(current) && !is_idle_vcpu(current) )
{
paddr_t efi_rs_page_table(void)
{
- return virt_to_maddr(efi_l4_pgtable);
+ return efi_l4_pgtable ? virt_to_maddr(efi_l4_pgtable) : 0;
}
unsigned long efi_get_time(void)
EFI_STATUS status;
unsigned long cr3 = efi_rs_enter(), flags;
+ if ( !cr3 )
+ return 0;
spin_lock_irqsave(&rtc_lock, flags);
status = efi_rs->GetTime(&time, NULL);
spin_unlock_irqrestore(&rtc_lock, flags);
EFI_STATUS status;
unsigned long cr3 = efi_rs_enter();
+ if ( !cr3 )
+ return;
status = efi_rs->ResetSystem(EfiResetShutdown, EFI_SUCCESS, 0, NULL);
efi_rs_leave(cr3);
EFI_STATUS status;
unsigned long cr3 = efi_rs_enter();
+ if ( !cr3 )
+ return;
status = efi_rs->ResetSystem(warm ? EfiResetWarm : EfiResetCold,
EFI_SUCCESS, 0, NULL);
efi_rs_leave(cr3);
{
unsigned long cr3 = efi_rs_enter();
+ if ( !cr3 )
+ return -EOPNOTSUPP;
info->version = efi_rs->Hdr.Revision;
efi_rs_leave(cr3);
break;
info->cfg.nent = efi_num_ct;
break;
case XEN_FW_EFI_VENDOR:
+ if ( !efi_fw_vendor )
+ return -EOPNOTSUPP;
info->vendor.revision = efi_fw_revision;
n = info->vendor.bufsz / sizeof(*efi_fw_vendor);
if ( !guest_handle_okay(guest_handle_cast(info->vendor.name,
return -EINVAL;
cr3 = efi_rs_enter();
+ if ( !cr3 )
+ return -EOPNOTSUPP;
spin_lock_irqsave(&rtc_lock, flags);
status = efi_rs->GetTime(cast_time(&op->u.get_time.time), &caps);
spin_unlock_irqrestore(&rtc_lock, flags);
return -EINVAL;
cr3 = efi_rs_enter();
+ if ( !cr3 )
+ return -EOPNOTSUPP;
spin_lock_irqsave(&rtc_lock, flags);
status = efi_rs->SetTime(cast_time(&op->u.set_time));
spin_unlock_irqrestore(&rtc_lock, flags);
return -EINVAL;
cr3 = efi_rs_enter();
+ if ( !cr3 )
+ return -EOPNOTSUPP;
spin_lock_irqsave(&rtc_lock, flags);
status = efi_rs->GetWakeupTime(&enabled, &pending,
cast_time(&op->u.get_wakeup_time));
return -EINVAL;
cr3 = efi_rs_enter();
+ if ( !cr3 )
+ return -EOPNOTSUPP;
spin_lock_irqsave(&rtc_lock, flags);
status = efi_rs->SetWakeupTime(!!(op->misc &
XEN_EFI_SET_WAKEUP_TIME_ENABLE),
return -EINVAL;
cr3 = efi_rs_enter();
- status = efi_rs->GetNextHighMonotonicCount(&op->misc);
+ if ( cr3 )
+ status = efi_rs->GetNextHighMonotonicCount(&op->misc);
+ else
+ rc = -EOPNOTSUPP;
efi_rs_leave(cr3);
break;
data = NULL;
cr3 = efi_rs_enter();
- status = efi_rs->GetVariable(
- name, cast_guid(&op->u.get_variable.vendor_guid),
- &op->misc, &size, data);
- efi_rs_leave(cr3);
+ if ( cr3 )
+ {
+ status = efi_rs->GetVariable(
+ name, cast_guid(&op->u.get_variable.vendor_guid),
+ &op->misc, &size, data);
+ efi_rs_leave(cr3);
- if ( !EFI_ERROR(status) &&
- copy_to_guest(op->u.get_variable.data, data, size) )
- rc = -EFAULT;
- op->u.get_variable.size = size;
+ if ( !EFI_ERROR(status) &&
+ copy_to_guest(op->u.get_variable.data, data, size) )
+ rc = -EFAULT;
+ op->u.get_variable.size = size;
+ }
+ else
+ rc = -EOPNOTSUPP;
xfree(data);
xfree(name);
else
{
cr3 = efi_rs_enter();
- status = efi_rs->SetVariable(
- name, cast_guid(&op->u.set_variable.vendor_guid),
- op->misc, op->u.set_variable.size, data);
+ if ( cr3 )
+ status = efi_rs->SetVariable(
+ name, cast_guid(&op->u.set_variable.vendor_guid),
+ op->misc, op->u.set_variable.size, data);
+ else
+ rc = -EOPNOTSUPP;
efi_rs_leave(cr3);
}
}
cr3 = efi_rs_enter();
- status = efi_rs->GetNextVariableName(
- &size, name.str,
- cast_guid(&op->u.get_next_variable_name.vendor_guid));
- efi_rs_leave(cr3);
+ if ( cr3 )
+ {
+ status = efi_rs->GetNextVariableName(
+ &size, name.str,
+ cast_guid(&op->u.get_next_variable_name.vendor_guid));
+ efi_rs_leave(cr3);
- if ( !EFI_ERROR(status) &&
- copy_to_guest(op->u.get_next_variable_name.name, name.raw, size) )
- rc = -EFAULT;
- op->u.get_next_variable_name.size = size;
+ if ( !EFI_ERROR(status) &&
+ copy_to_guest(op->u.get_next_variable_name.name,
+ name.raw, size) )
+ rc = -EFAULT;
+ op->u.get_next_variable_name.size = size;
+ }
+ else
+ rc = -EOPNOTSUPP;
xfree(name.raw);
}
}
cr3 = efi_rs_enter();
- if ( (efi_rs->Hdr.Revision >> 16) < 2 )
+ if ( !cr3 || (efi_rs->Hdr.Revision >> 16) < 2 )
{
efi_rs_leave(cr3);
return -EOPNOTSUPP;
return -EINVAL;
cr3 = efi_rs_enter();
- if ( (efi_rs->Hdr.Revision >> 16) < 2 )
+ if ( !cr3 || (efi_rs->Hdr.Revision >> 16) < 2 )
{
efi_rs_leave(cr3);
return -EOPNOTSUPP;